<?php
declare(strict_types=1);
/**
 * 本地文件写入存储类
 */
class FileStorage {
	private static array $contents = array ();

    /**
     * 文件内容读取
     *
     * @param string $filename 文件名
     * @param string $type
     * @return mixed
     */
	public static function read(string $filename, string $type = ''): mixed
    {
		return FileStorage::get ( $filename, 'content', $type );
	}

    /**
     * 文件写入
     *
     * @param string $filename 文件名
     * @param string $content
     * @param string $type
     * @return boolean
     * @throws Exception
     */
	public static function put(string $filename, string $content, string $type = ''): bool
    {
		$dir = dirname ( $filename );
		if (! is_dir ( $dir ))
			mkdir ( $dir, 0664, true );
		if (false === file_put_contents ( $filename, $content )) {
            return false;
		} else {
            self::$contents [$filename] = $content;
            return true;
		}
	}

    /**
     * 文件追加写入
     *
     * @param string $filename
     * @param string $content
     * @param string $type
     * @return boolean
     * @throws Exception
     */
	public static function append(string $filename, string $content, string $type = ''): bool
    {
		if (is_file ( $filename )) {
			$content = FileStorage::read($filename, $type) . $content;
		}
		return FileStorage::put ( $filename, $content, $type );
	}

    /**
     * 加载文件
     *
     * @param $_filename
     * @param array|null $vars 传入变量
     * @return void
     */
	public static function load($_filename, array $vars = null): void
    {
		if (! is_null ( $vars ))
			extract ( $vars, EXTR_OVERWRITE );
		include $_filename;
	}

    /**
     * 文件是否存在
     *
     * @param string $filename 文件名
     * @param string $type
     * @return boolean
     */
	public static function has(string $filename, string $type = ''): bool
    {
		return is_file ( $filename );
	}

    /**
     * 文件删除
     *
     * @param string $filename 文件名
     * @param string $type
     * @return boolean
     */
	public static function unlink(string $filename, string $type = ''): bool
    {
		unset ( self::$contents [$filename] );
		return is_file($filename) && unlink($filename);
	}

    /**
     * 读取文件信息
     *
     * @param string $filename 文件名
     * @param string $name     信息名 mtime或者content
     * @param string $type
     * @return mixed
     */
	public static function get(string $filename, string $name, string $type = ''): mixed
    {
		if (! isset ( self::$contents [$filename] )) {
			if (! is_file ( $filename ))
				return false;
            self::$contents [$filename] = file_get_contents ( $filename );
		}
		$content = self::$contents [$filename];
		$info = array (
				'mtime' => filemtime ( $filename ),
				'content' => $content
		);
		return $info [$name];
	}
}
